#!/usr/bin/env python3
"""
使用Access DAO对象模型探索数据库
这种方法可以绕过ODBC的权限限制
"""

import os
import sys
from pathlib import Path

def explore_access_with_dao():
    """使用DAO对象模型探索Access数据库"""
    print("🔍 使用DAO对象模型探索Access数据库...")
    
    try:
        import win32com.client
        print("✅ 成功导入win32com模块")
    except ImportError:
        print("❌ 需要安装pywin32模块")
        print("请运行: pip install pywin32")
        return
    
    # 数据库文件路径
    db_path = Path("ERP2.accdb").absolute()
    print(f"📁 数据库文件: {db_path}")
    
    if not db_path.exists():
        print("❌ 数据库文件不存在")
        return
    
    try:
        # 创建Access应用程序对象
        print("🔧 创建Access应用程序对象...")
        access_app = win32com.client.Dispatch("Access.Application")
        
        # 打开数据库
        print("📂 打开数据库...")
        access_app.OpenCurrentDatabase(str(db_path))
        
        # 获取当前数据库对象
        db = access_app.CurrentDb()
        print("✅ 成功打开数据库")
        
        # 获取所有表
        print("\n📋 获取所有表...")
        tables = db.TableDefs
        
        found_tables = []
        for table in tables:
            table_name = table.Name
            # 过滤系统表
            if not table_name.startswith('MSys') and not table_name.startswith('~'):
                found_tables.append(table_name)
                print(f"  ✅ 找到表: {table_name}")
                
                # 获取表结构
                try:
                    fields = table.Fields
                    field_names = []
                    for field in fields:
                        field_names.append(field.Name)
                    print(f"     字段: {', '.join(field_names[:5])}{'...' if len(field_names) > 5 else ''}")
                except Exception as e:
                    print(f"     无法获取字段信息: {e}")
        
        if found_tables:
            print(f"\n🎉 成功找到 {len(found_tables)} 个用户表:")
            for i, table in enumerate(found_tables, 1):
                print(f"  {i}. {table}")
        else:
            print("\n❌ 没有找到用户表")
            
            # 尝试获取所有对象（包括系统表）
            print("\n📋 尝试获取所有对象...")
            all_tables = []
            for table in tables:
                all_tables.append(table.Name)
            
            print(f"所有对象: {all_tables}")
        
        # 关闭数据库和应用程序
        access_app.CloseCurrentDatabase()
        access_app.Quit()
        
        return found_tables
        
    except Exception as e:
        print(f"❌ 使用DAO探索失败: {e}")
        return []

def explore_access_with_jet():
    """使用Jet引擎探索Access数据库"""
    print("\n🔍 尝试使用Jet引擎探索...")
    
    try:
        import win32com.client
        
        # 创建Jet引擎对象
        engine = win32com.client.Dispatch("DAO.DBEngine.36")
        
        # 数据库文件路径
        db_path = Path("ERP2.accdb").absolute()
        
        # 打开数据库
        db = engine.OpenDatabase(str(db_path))
        print("✅ 成功使用Jet引擎打开数据库")
        
        # 获取表集合
        tables = db.TableDefs
        
        found_tables = []
        for table in tables:
            table_name = table.Name
            if not table_name.startswith('MSys') and not table_name.startswith('~'):
                found_tables.append(table_name)
                print(f"  ✅ 找到表: {table_name}")
        
        # 关闭数据库
        db.Close()
        
        return found_tables
        
    except Exception as e:
        print(f"❌ 使用Jet引擎探索失败: {e}")
        return []

if __name__ == "__main__":
    print("🚀 开始探索Access数据库...")
    print("=" * 60)
    
    # 方法1: 使用DAO
    tables1 = explore_access_with_dao()
    
    # 方法2: 使用Jet引擎
    tables2 = explore_access_with_jet()
    
    # 合并结果
    all_tables = list(set(tables1 + tables2))
    
    print("\n" + "=" * 60)
    if all_tables:
        print(f"🎉 最终找到 {len(all_tables)} 个表:")
        for i, table in enumerate(all_tables, 1):
            print(f"  {i}. {table}")
    else:
        print("❌ 没有找到任何表")
        print("\n💡 可能的原因:")
        print("1. 数据库文件可能损坏")
        print("2. 数据库可能没有用户表")
        print("3. 需要安装Microsoft Access")
        print("4. 需要管理员权限")
    
    print("\n" + "=" * 60)
